/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cz.hamacekj.dotaznikklient;

import java.util.ArrayDeque;
import java.util.Queue;

/**
 * Fronta dotazů, na které se již server zeptal, ale uživatel na ně ještě neodpověděl
 * protože právě odpovídá na jinou otázku.
 * @author Jan Hamáček
 */
public class QuestionsQueue {

    public QuestionsQueue() {
        this.queue = new ArrayDeque<>();
    }
    
    /**
     * Přidá jednu otázku do fronty. Pokud by to byla jediná otázka ve frontě, hned jí spustí.
     * @param q Otázka k přidání/spuštění.
     */
    public synchronized void add(Question q){
        queue.add(q);
        this.runNext();
    }
    
    /**
     * Vymaže frontu, zavře běžící otázku.
     */
    public synchronized void cancel(){
        queue.clear();
        if(running.isDisplayed()){
            running.cancel();
        }
    }
    
    /**
     * Pokud existují nějaké otázky ve frontě, zeptá se na první z nich. Jinak neudělá nic.
     */
    public synchronized void runNext(){
        // pokud je neprazdna fronta dotazu a zaroven zadny dotaz nebezi, pak jeden spust
        if(!queue.isEmpty() && (running == null || !running.isDisplayed())){
            running = queue.remove();
            running.invokeGUIAndSendReply();
        }
    }
    
    
    private Queue<Question> queue;
    private Question running;
    
    
}
